๐๏ธ ๋์์ฑ ํ๊ฒฝ์์ DB ๋ฝ์ ์ด์ฉํ ํฐ์ผ ์์ฝ ์์คํ ํ ์คํธ
โ ํ ์คํธ ๋ชฉํ
100๊ฐ์ ํฐ์ผ์ ๋์์ผ๋ก ์์ฒ ๋ช ์ ์ ์ ๊ฐ ๋์์ ์์ฝ ์์ฒญ์ ๋ณด๋์ ๋,
๋์์ฑ ์ด์ ์์ด ์ ํํ 100๋ช ๊น์ง๋ง ์์ฝ๋๋๋ก ์ ์ด๋๋์ง ๊ฒ์ฆํ๋ค.
1๏ธโฃ ๋ฝ์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ
๐ ์ฝ๋ ๋ณด๊ธฐ
-
์ค๋ช :
๋์์ฑ ์ ์ด ์์ด
reserveTicket()์ ํธ์ถํ ๊ธฐ๋ณธ ๊ตฌํ. -
์๋๋ฆฌ์ค:
1000๋ช ์ ์ฌ์ฉ์๊ฐ ๋์์ 100๊ฐ์ ํฐ์ผ์ ์์ฝ ์๋. -
๊ฒฐ๊ณผ:
โ ํ ์คํธ ์คํจ โ ๋์์ฑ ์ ์ด ๋ถ์ฌ๋ก ํฐ์ผ ์๋ ์ด๊ณผ ์์ฝ ๋ฐ์.
2๏ธโฃ-1 ๋น๊ด์ ๋ฝ(Pessimistic Lock)์ ์ ์ฉํ ๊ฒฝ์ฐ
๐ ์ฝ๋ ๋ณด๊ธฐ
-
์ค๋ช :
@Lock(LockModeType.PESSIMISTIC_WRITE)๋ฅผ ์ ์ฉํด ๋์์ ํ๋์ ํฐ์ผ๋ง ์์ ๊ฐ๋ฅํ๋๋ก ์ ํ. -
์๋๋ฆฌ์ค:
10000๋ช ์ ์ฌ์ฉ์๊ฐ ๋์์ 100๊ฐ์ ํฐ์ผ์ ์์ฝ ์๋. -
๊ฒฐ๊ณผ:
โ ํ ์คํธ ์ฑ๊ณต โ ์ ํํ
100๋ช ๋ง ์์ฝ๋จ. -
๋ฌธ์ ์ :
- ์ฌ์ฉ์ 10,000๋ช
์
๊ฐ๋ณ์ ์ผ๋ก ์ ์ฅํด ํ ์คํธ ์๊ฐ์ด ๋งค์ฐ ๊ธธ์ด์ง.- ํด๊ฒฐ ๋ฐฉ๋ฒ : ๋ฒํฌ Insert (
saveAll()) ์ฌ์ฉ
- ํด๊ฒฐ ๋ฐฉ๋ฒ : ๋ฒํฌ Insert (
- ์ฌ์ฉ์ 10,000๋ช
์
2๏ธโฃ-2 saveAll() ํ์ฉํ ๋ฒํฌ Insert ์๋
๐ ์ฝ๋ ๋ณด๊ธฐ
-
์ค๋ช :
saveAll()๋ก ์ฌ์ฉ์ 10,000๋ช ์ ํ ๋ฒ์ ์ ์ฅ. -
๋ฌธ์ ์ :
- ๋ด๋ถ์ ์ผ๋ก ์ฌ์ ํ
persist()๋ฅผ ๋ฃจํ ๋๋ฉฐ ํธ์ถ โ์ฟผ๋ฆฌ N๋ฒ ๋ฐ์. - ์ฆ, ์ค์ ๋ฒํฌ ์ฑ๋ฅ์ ๊ธฐ๋๋ณด๋ค ๋ฎ์.
- ๋ด๋ถ์ ์ผ๋ก ์ฌ์ ํ
-
ํด๊ฒฐ ๋ฐฉ์:
Hibernate์ Batch Insert ์ค์ +
EntityManager์ง์ ์ฌ์ฉ.
2๏ธโฃ-3 EntityManager + @Transactional ๋ฐฉ์ ์ ์ฉ
๐ ์ฝ๋ ๋ณด๊ธฐ
-
์ค๋ช :
@PersistenceContext๋ก ์ฃผ์ ํEntityManager๋ฅผ ํตํดflush()&clear()๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํธ์ถํ๋ฉฐ batch ์ฒ๋ฆฌ. -
๋ฌธ์ ๋ฐ์: โ
@Transactional์ด ์ ์ฉ๋์ง ์์@Transactional self-invocation (in effect, a method within the target object calling another method of the target object) does not lead to an actual transaction at runtime -
์ด์ :
- Spring์ AOP ๊ธฐ๋ฐ์ผ๋ก ํธ๋์ญ์ ์ฒ๋ฆฌ
- ๊ฐ์ ํด๋์ค ๋ด์์ ๋ฉ์๋ ํธ์ถ(this) โ ํ๋ก์ ์ฐํ โ ํธ๋์ญ์ ์ ์ฉ ์ ๋จ
2๏ธโฃ-4 Self-Invocation ๋ฌธ์ ํด๊ฒฐ: Self ์ฃผ์ ๊ตฌ์กฐ ๋์
๐ ์ฝ๋ ๋ณด๊ธฐ
-
์ค๋ช :
this.insertUsersInBulk()๋์ , Bean์ผ๋ก ์ฃผ์ ๋ ์์ (Self) ์ ํตํด ํธ์ถ -
๋ฌธ์ ๋ฐ์: โ ํ ์คํธ ํด๋์ค์
@Autowired TicketReservationServiceTestโCould not autowire. No beans of 'TicketReservationServiceTest' type found. -
์ด์ :
-
@Transactional์ด ๋ถ์insertUsersInBulk()๋ฅผ ๊ฐ์ ํด๋์ค ๋ด์์ ํธ์ถํ๊ณ ์์ด์ ํธ๋์ญ์ ์ด ์ ์ฉ๋์ง ์๊ณ , ๊ทธ ๊ฒฐ๊ณผEntityManager๊ฐ ํธ๋์ญ์ ๋ฐ๊นฅ์์ ์คํ๋๋ฉฐ ์ค๋ฅ๊ฐ ๋ฐ์ -
ํ ์คํธ ํด๋์ค๋
@SpringBootTest๋ก ์คํ๋์ง๋ง, ์ผ๋ฐ์ ์ธ Spring Bean์ผ๋ก ๋ฑ๋ก๋์ง ์์
2๏ธโฃ-5 ์ต์ข ํด๊ฒฐ โ ๋ฒํฌ Insert ์ ์ฉ ์๋น์ค ๋ถ๋ฆฌ
๐ ์ฝ๋ ๋ณด๊ธฐ
-
์ค๋ช :
@Serviceํด๋์ค๋กInsertUsersInBulkService๋ฅผ ๋ถ๋ฆฌํ๊ณ ,์ฌ๊ธฐ์
@Transactional๊ณผEntityManager๋ฅผ ์ ์ฉํด ์ฌ๋ฐ๋ฅธ ํธ๋์ญ์ ์ฒ๋ฆฌ ๊ตฌํ. -
๊ฒฐ๊ณผ: ํธ๋์ญ์ ์ ์ ๋์ + ๋น ๋ฅธ ๋์ฉ๋ insert ์ฒ๋ฆฌ
ํ ์คํธ ์ฑ๊ณต
| ํ ์คํธ ๋ฐฉ์ | ๊ฒฐ๊ณผ | ๋์์ฑ ์ ์ด | ์ฑ๋ฅ ๋ฌธ์ | ํธ๋์ญ์ ๋ฌธ์ |
|---|---|---|---|---|
| ๋จ์ ๋ก์ง | โ ์คํจ | โ ์์ | โ ๋๋ฆผ | - |
| Pessimistic Lock | โ ์ฑ๊ณต | โ ์์ | โ ๋๋ฆผ | - |
| saveAll() | โ ์ฑ๊ณต | โ ์์ | โ ๏ธ ๊ธฐ๋ ์ดํ | - |
| EntityManager | โ ์คํจ | โ ์์ | โ ๋น ๋ฆ | โ ์ ์ฉ ์ ๋จ |
| Self ์ฃผ์ ๊ตฌ์กฐ | โ ์คํจ | โ ์์ | โ ๋น ๋ฆ | โ ํ ์คํธ ํด๋์ค ๋ถ๊ฐ |
| ์๋น์ค ๋ถ๋ฆฌ | โ ์ฑ๊ณต | โ ์์ | โ ๋น ๋ฆ | โ ์ ์ ๋์ |
๐๏ธ Written by ํ์น๋ฏผ